﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2009-10-15
//
// Update Date :            
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class FAPI FU_LT_ITEM
{
    FUI_DECLARE_STRUCT(FU_LT_ITEM)

    friend class FUI_List;

protected:
    int nHeight;            // 此项的高度
    int nIndex;             // 项的索引 (由控件设置)
    bool bSelect;           // 当前是否是选中项
    bool bSuspend;          // 当前是否是悬停项

public:
    WCHAR szText[128];      // 该项显示的内容
    DWORD dwColor;          // 如果此值为0，则使用UI编辑器设置的字体颜色
    bool bCheck;            // 复选框状态
    WCHAR szNote[32];       // 备注 (控件不用，由使用者控制)
    int nID;                // ID号 (控件不用，由使用者控制)
    DWORD_PTR dwDataPtr;    // 数据 (控件不用，由使用者控制)

protected:
    FU_LT_ITEM(const WCHAR* name)
        :nIndex(0)
        ,dwColor(0)
        ,bSelect(false)
        ,bSuspend(false)
        ,bCheck(false)
        ,nHeight(0)
        ,nID(0)
        ,dwDataPtr(0)
    {
        FUI_StrcpyW(szText, name);
        *szNote = 0;
    }

public:
    FINLINE const WCHAR* GetText(){ return szText; }
    FINLINE void SetText(const WCHAR* txt){ FUI_StrcpyW(szText, txt); }
    FINLINE int GetHeight(){ return nHeight; }
    FINLINE int GetIndex(){ return nIndex; }
    FINLINE bool IsSelect(){ return bSelect; }
    FINLINE bool IsSuspend(){ return bSuspend; }
};
typedef FUI_Vector< FU_LT_ITEM* > FV_UI_PLT_ITEM;


//----------------------------------------------------------------
// 自定义单行绘制函数
//----------------------------------------------------------------
class FUI_List;
typedef void (*FUI_List_Render)(FUI_List* pctrl, fuRect* rc, FU_LT_ITEM* pData, bool non_text);


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class FAPI FUI_List : public FUI_Object
{
    FUI_DECLARE_CLASS(FUI_List)

    friend class FUI_Combo;

public:
    FUI_List(EF_UI_WIDGET_TYPE t = eUWT_List);
    virtual ~FUI_List();
    virtual void Release();
    virtual void Render(EF_UI_RENDER_LAYER layer);
    virtual void UpdateRect();
    virtual bool IsChild(FUI_Object* pChild);
    virtual void SetHeight(funit h);
    virtual bool HasClip(){ return !vListData.empty(); }
    virtual bool OnKeyDown(unsigned int nChar);
    virtual bool OnMouseWheel(bool bUp, funit nX, funit nY);
    virtual bool OnMouseMove(funit nX, funit nY);
    virtual bool OnLButtonDown(funit nX, funit nY);
    virtual bool OnLButtonUp(funit nX, funit nY);
    virtual void OnFrameHide(bool visable);

    // 获取列表项
    FINLINE FU_LT_ITEM* Get(int index){ assert(index >= 0 && index < Count()); return vListData[index]; }
    FINLINE FU_LT_ITEM* GetSelect(){ return pSelectData; }
    FINLINE FU_LT_ITEM* GetSuspend(){ return pSuspendData; }
    // 列表总条数
    FINLINE int Count(){ return (int)vListData.size(); }
    // 添加一项
    FU_LT_ITEM* AddItem(const WCHAR* text, int index = -1);
    FU_LT_ITEM* AddItem(const ACHAR* text, int index = -1);
    // 删除项
    void DelItemByText(const WCHAR* text);
    void DelItemByText(const ACHAR* text);
    void DelItemByIndex(int index);
    void DelItemByID(int id);
    void DelItemByDataPtr(DWORD_PTR dwptr);
    // 查找项
    FU_LT_ITEM* FindItemByText(const WCHAR* text);
    FU_LT_ITEM* FindItemByText(const ACHAR* text);
    FU_LT_ITEM* FindItemByIndex(int index);
    FU_LT_ITEM* FindItemByID(int id);
    FU_LT_ITEM* FindItemByDataPtr(DWORD_PTR dwptr);
    FU_LT_ITEM* SetSelectByIndex(int index,bool bScrollBar = false);
    FU_LT_ITEM* SetSelectByText(const WCHAR* text, bool nofind_clear);
    FU_LT_ITEM* SetSelectByText(const ACHAR* text, bool nofind_clear);
    // 设置项高
    void SetItemHeight(int index, int height);
    // 清空列表
    void Clear();
    // 设置项的自定义绘制函数
    void SetRenderFunc(FUI_List_Render render){ pLstRender = render; }
    // 是否有复选框
    FINLINE bool IsHasCheck(){ return pListData->IsHasCheck(); }
    // 设置是否有复选框
    FINLINE void SetHasCheck(bool check){ pListData->SetHasCheck(check); }
    // 取消当前状态
    void CancelSelect();
    void CancelSuspend();
    // 获取某项的Y编移
    int GetItemOffsetY(int index);
    // 获取部分控件数据
    FINLINE FUI_ScrollBar& GetScroll(){ return uScrollBar; }

protected:
    virtual void InitUIData(FUI_Object* father, fuWidgetBase* pData, FUI_Layout* layout);
    virtual void Update();

    // 返回值表示是否结束循环
    typedef bool (FUI_List::*LB_WorkFunc)(FU_LT_ITEM* data, fuRect* dst, funit nX, funit nY);
    bool forWorkRenderNonText(FU_LT_ITEM* data, fuRect* dst, funit nX, funit nY);
    bool forWorkRenderWithText(FU_LT_ITEM* data, fuRect* dst, funit nX, funit nY);
    bool forWorkMouseMove(FU_LT_ITEM* data, fuRect* dst, funit nX, funit nY);
    bool forWorkLButtonUp(FU_LT_ITEM* data, fuRect* dst, funit nX, funit nY);
    void forWorkLBProcess(LB_WorkFunc pwork, funit nX, funit nY, bool clip);

protected:
    fuWidgetList* pListData;        // 控件数据地址
    FUI_ScrollBar uScrollBar;
    FV_UI_PLT_ITEM vListData;       // 数据表
    FU_LT_ITEM* pSelectData;        // 当前选中的项
    FU_LT_ITEM* pSuspendData;       // 当前鼠标悬停的项
    FUI_List_Render pLstRender;     // 自定义绘制函数
};